package com.minsu.service.impl;

import com.alibaba.excel.util.StringUtils;
import com.minsu.entity.*;
import com.minsu.mapper.FuelMapper;
import com.minsu.mapper.ProductionOrdersMapper;
import com.minsu.service.ProductionOrdersService;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

@Service
public class ProductionOrdersServiceImpl implements ProductionOrdersService {

    @Autowired
    private ProductionOrdersMapper productionOrdersMapper;
    @Override
    public PageResult<ProductionOrder> findAll(@NotNull PageRequest pageRequest) {
        // 查询总记录数
        Long totalCount = productionOrdersMapper.countAll();

        // 计算偏移量
        int offset = (pageRequest.getPageNum() - 1) * pageRequest.getPageSize();

        // 查询当前页数据（保持原有逻辑）
        List<ProductionOrder> productionOrders = productionOrdersMapper.findAll(offset, pageRequest.getPageSize());

        // 返回分页结果
        // 返回分页结果（修正泛型类型和变量名）
        return PageResult.<ProductionOrder>builder()  // 指定正确的泛型类型
                .pageNum(pageRequest.getPageNum())
                .pageSize(pageRequest.getPageSize())
                .totalCount(totalCount)
                .totalPages((int) Math.ceil((double) totalCount / pageRequest.getPageSize()))
                .data(productionOrders)  // 修正变量名
                .build();
    }


//    @Override
//    @Transactional
//    public void add(ProductionOrder productionOrder) {
//        // Set creation and update times
//        Date now = new Date();
//        productionOrder.setCreatedAt(now);
//        productionOrder.setUpdatedAt(now);
//        // 生成日期部分（格式：yyyyMMdd）
//        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
//        String datePart = sdf.format(now);
//
//        // 查询当天最大批次号
//        String maxBatchNo = productionOrdersMapper.getMaxBatchNoByDate(datePart);
//
//        // 计算下一个序列号（默认从1开始）
//        int nextSequence = 1;
//        if (maxBatchNo != null && !maxBatchNo.isEmpty()) {
//            // 提取序列号部分（假设批次号为 yyyyMMdd+3位数字，如20250602001）
//            String sequenceStr = maxBatchNo.substring(datePart.length()); // 截取后3位
//            nextSequence = Integer.parseInt(sequenceStr) + 1;
//        }
//
//        // 格式化为3位数字（补前导零）
//        String batchNo = datePart + String.format("%03d", nextSequence);
//        productionOrder.setBatchNo(batchNo);
//
//        String ProductionOrderNo = null;
//        try {
//            ProductionOrderNo = OrderNoGenerator.generateProductionOrderNo();
//        } catch (Exception e) {
//            throw new RuntimeException(e);
//        }
//
//        productionOrder.setProductionOrderNo(ProductionOrderNo);
//
//        // 插入主订单和明细
//        productionOrdersMapper.add(productionOrder);
//
//        if (productionOrder.getDetails() != null && !productionOrder.getDetails().isEmpty()) {
//            batchNo = productionOrder.getBatchNo(); // 获取主订单批次号
//            for (ProductionOrderDetail detail : productionOrder.getDetails()) {
//                detail.setOrderId(productionOrder.getOrderId());
//                detail.setBatchNo(batchNo); // 新增此行，设置批次号
//                detail.setCreatedAt(now);
//                detail.setUpdatedAt(now);
//                productionOrdersMapper.addDetail(detail);
//            }
//        }
//
//
//    }

    @Override
    @Transactional
    public void deleteById(Integer orderId) {
        // Delete details first to maintain referential integrity
        productionOrdersMapper.deleteDetailsByOrderId(orderId);
        // Then delete the main order
        productionOrdersMapper.deleteById(orderId);
    }

    @Override
    public ProductionOrder findById(Integer orderId) {
        ProductionOrder productionOrder = productionOrdersMapper.findById(orderId);
        if (productionOrder != null) {
            // Load details if the main order exists
            List<ProductionOrderDetail> details = productionOrdersMapper.findDetailsByOrderId(orderId);
            productionOrder.setDetails(details);
        }
        return productionOrder;
    }

//    @Override
//    @Transactional
//    public void update(ProductionOrder productionOrder) {
//        // Update timestamp
//        productionOrder.setUpdatedAt(new Date());
//
//        // Update main order
//        productionOrdersMapper.update(productionOrder);
//
//        // Handle details update if present
//        if (productionOrder.getDetails() != null) {
//            // Delete existing details
//            productionOrdersMapper.deleteDetailsByOrderId(productionOrder.getOrderId());
//
//            // Add new details
//            if (!productionOrder.getDetails().isEmpty()) {
//                Date now = new Date();
//                for (ProductionOrderDetail detail : productionOrder.getDetails()) {
//                    detail.setOrderId(productionOrder.getOrderId());
//                    detail.setUpdatedAt(now);
//                    productionOrdersMapper.addDetail(detail);
//                }
//            }
//        }
//    }

    @Autowired
    private FuelMapper fuelMapper;



    @Transactional
    public void add(ProductionOrder productionOrder) {

                Date now = new Date();
        productionOrder.setCreatedAt(now);
        productionOrder.setUpdatedAt(now);
        // 生成日期部分（格式：yyyyMMdd）
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        String datePart = sdf.format(now);

        // 查询当天最大批次号
        String maxBatchNo = productionOrdersMapper.getMaxBatchNoByDate(datePart);

        // 计算下一个序列号（默认从1开始）
        int nextSequence = 1;
        if (maxBatchNo != null && !maxBatchNo.isEmpty()) {
            // 提取序列号部分（假设批次号为 yyyyMMdd+3位数字，如20250602001）
            String sequenceStr = maxBatchNo.substring(datePart.length()); // 截取后3位
            nextSequence = Integer.parseInt(sequenceStr) + 1;
        }

        // 格式化为3位数字（补前导零）
        String batchNo = datePart + String.format("%03d", nextSequence);
        productionOrder.setBatchNo(batchNo);

        String ProductionOrderNo = null;
        try {
            ProductionOrderNo = OrderNoGenerator.generateProductionOrderNo();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        productionOrder.setProductionOrderNo(ProductionOrderNo);

        // 插入主订单和明细
        productionOrdersMapper.add(productionOrder);

        if (productionOrder.getDetails() != null && !productionOrder.getDetails().isEmpty()) {
            batchNo = productionOrder.getBatchNo(); // 获取主订单批次号
            for (ProductionOrderDetail detail : productionOrder.getDetails()) {
                detail.setOrderId(productionOrder.getOrderId());
                detail.setBatchNo(batchNo); // 新增此行，设置批次号
                detail.setCreatedAt(now);
                detail.setUpdatedAt(now);
                productionOrdersMapper.addDetail(detail);
            }
        }

        // 处理明细


        // 更新炉料出库时间（关键步骤）
        updateFuelOutTime(productionOrder);
    }

    @Transactional
    public void update(ProductionOrder productionOrder) {
        // 设置更新时间
        productionOrder.setUpdatedAt(new Date());

        // 更新主订单 - 使用您提供的@Update注解方法
        productionOrdersMapper.update(productionOrder);

        // 处理明细
        if (productionOrder.getDetails() != null) {
            // 删除旧明细
            productionOrdersMapper.deleteDetailsByOrderId(productionOrder.getOrderId());

            // 添加新明细
            if (!productionOrder.getDetails().isEmpty()) {
                Date now = new Date();
                for (ProductionOrderDetail detail : productionOrder.getDetails()) {
                    detail.setOrderId(productionOrder.getOrderId());
                    detail.setUpdatedAt(now);
                    productionOrdersMapper.addDetail(detail);
                }
            }
        }

        // 更新炉料出库时间（关键步骤）
        updateFuelOutTime(productionOrder);
    }

    /**
     * 更新炉料出库时间
     */
    private void updateFuelOutTime(ProductionOrder order) {
        // 获取所有关联的炉料批次号
        List<String> batchNos = new ArrayList<>();

        // 1. 添加主订单的批次号
        if (StringUtils.isNotBlank(order.getBatchNo())) {
            batchNos.add(order.getBatchNo());
        }

        // 2. 添加明细中的批次号
        if (order.getDetails() != null) {
            for (ProductionOrderDetail detail : order.getDetails()) {
                if (StringUtils.isNotBlank(detail.getBatchNo())) {
                    batchNos.add(detail.getBatchNo());
                }
            }
        }

        // 3. 去重并更新
        if (!batchNos.isEmpty()) {
            List<String> distinctBatchNos = batchNos.stream()
                    .distinct()
                    .collect(Collectors.toList());

            // 使用fuelMapper更新炉料出库时间
            fuelMapper.updateOutTimeByBatchNos(
                    distinctBatchNos,
                    order.getProductionTime()
            );
        }
    }
}
